//进行axios二次封装:使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
import jsonBig from 'json-bigint'
//引入用户相关的仓库
import useUserStore from '@/stores/modules/user.js'
//第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间)
const request = axios.create({
    //基础路径上会携带/api
    // baseURL: 'http://127.0.0.1:8080/api/v1/backend',
    // baseURL: 'http://1.94.213.53:8080/api/v1/backend',
    // baseURL: 'http://182.92.164.172:28591/api/v1/backend',
    baseURL: 'https://kabeiduobaoji.cn:28591/api/v1/backend',

    //超时的时间的设置
    timeout: 5000,
    transformResponse: [
        function (data, headers) {
            const contentType = headers['content-type'];

            // 如果 Content-Type 是 Excel 文件类型，跳过 JSON 转换
            if (contentType && contentType.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
                return data // 返回原始二进制数据
            }

            try {
                const json = jsonBig({
                    storeAsString: true,
                })
                return json.parse(data)
            } catch (err) {
                console.error(err)
                return data
            }
        }
    ]
})

//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
    //获取用户相关的小仓库:获取仓库内部token,登录成功以后携带给服务器
    const userStore = useUserStore()

    if (userStore.token) {
        config.headers.token = userStore.token
    }
    //config配置对象,headers属性请求头,经常给服务器端携带公共参数
    //返回配置对象
    return config
})

//第三步:响应拦截器
request.interceptors.response.use(
    (resp) => {
        const contentType = resp.headers['content-type'];

        // 如果 Content-Type 是 Excel 文件类型，跳过 JSON 转换
        if (contentType && contentType.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
            return resp.data // 返回原始二进制数据
        }

        //成功回调
        //简化数据 null | data
        const data = resp.data
        // console.log(data)
        if (data.code !== '0') {
            ElMessage({
                type: 'error',
                message: data.message,
            })
            return null
        }

        return data
    },
    (error) => {
        //失败回调:处理http网络错误的
        //定义一个变量:存储网络错误信息
        let message = ''
        //http状态码
        const status = error.response.status
        switch (status) {
            case 401:
                message = '无权限'
                break
            case 403:
                message = '无权访问'
                break
            case 404:
                message = '请求地址错误'
                break
            case 500:
                message = '服务器出现问题'
                break
            default:
                message = '网络出现问题'
                break
        }
        //提示错误信息
        ElMessage({
            type: 'error',
            message,
        })
        return Promise.reject(error)
    },
)
//对外暴露
export default request
